package com.kexilo.core.common.annotation;

import java.lang.annotation.*;
import java.util.concurrent.TimeUnit;

/**
 * 幂等性注解
 * 用于防止重复提交和确保接口幂等性
 * 
 * @author Kexilo
 */
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Idempotent {
    
    /**
     * 幂等性key前缀
     */
    String value() default "idempotent:";
    
    /**
     * 幂等性key表达式，支持SpEL
     * 例如：#request.userId + ':' + #request.orderId
     */
    String key() default "";
    
    /**
     * 幂等性时间窗口，默认5分钟
     */
    long timeout() default 5;
    
    /**
     * 时间单位，默认分钟
     */
    TimeUnit timeUnit() default TimeUnit.MINUTES;
    
    /**
     * 提示消息
     */
    String message() default "请勿重复操作";
    
    /**
     * 是否删除key，默认不删除
     * 如果设置为true，操作完成后会删除幂等性key
     */
    boolean delKey() default false;
    
    /**
     * 幂等性策略
     */
    Strategy strategy() default Strategy.REQUEST_PARAMS;
    
    /**
     * 幂等性策略枚举
     */
    enum Strategy {
        /**
         * 基于请求参数的幂等性
         */
        REQUEST_PARAMS,
        
        /**
         * 基于用户的幂等性
         */
        USER_BASED,
        
        /**
         * 基于IP的幂等性
         */
        IP_BASED,
        
        /**
         * 基于自定义key的幂等性
         */
        CUSTOM_KEY
    }
}
